package main

/*
合并K个升序链表
给你一个链表数组，每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中，返回合并后的链表。

示例 1：
输入：lists = [[1,4,5],[1,3,4],[2,6]]
输出：[1,1,2,3,4,4,5,6]
解释：链表数组如下：
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2：
输入：lists = []
输出：[]

示例 3：
输入：lists = [[]]
输出：[]
*/

type ListNode struct {
	Val  int
	Next *ListNode
}

//k个链表的合并，可以看做是k-1次，每两个链表之间的合并。
/*
func mergeKLists(lists []*ListNode) *ListNode {
	var pre, cur *ListNode
	n := len(lists)
	for i := 0; i < n; i++ {
		if i == 0 {
			pre = lists[i]
			continue
		}
		cur = lists[i]
		pre = merge_2(pre, cur)
	}
	return pre
}
func merge_2(l1, l2 *ListNode) *ListNode {
	head := &ListNode{}
	cur := head
	for l1 != nil || l2 != nil {
		if l1 != nil && l2 != nil {
			if l1.Val < l2.Val {
				cur.Next = l1
				l1 = l1.Next
			} else {
				cur.Next = l2
				l2 = l2.Next
			}
			cur = cur.Next
		} else if l1 != nil {
			cur.Next = l1
			break
		} else {
			cur.Next = l2
			break
		}
	}
	return head.Next
}
*/

//分治法
func mergeKLists(lists []*ListNode) *ListNode {
	// write code here
	length := len(lists)

	if length < 1 {
		return nil
	}
	if length == 1 {
		return lists[0]
	}
	mid := length / 2

	left := mergeKLists(lists[:mid])
	right := mergeKLists(lists[mid:])

	return Merge(left, right)
}

func Merge(pHead1 *ListNode, pHead2 *ListNode) *ListNode {
	// write code here
	dummy := &ListNode{}
	pre := dummy
	for pHead1 != nil && pHead2 != nil {
		if pHead1.Val <= pHead2.Val {
			pre.Next = pHead1
			pHead1 = pHead1.Next
		} else {
			pre.Next = pHead2
			pHead2 = pHead2.Next
		}
		pre = pre.Next
	}
	if pHead1 == nil {
		pre.Next = pHead2
	} else {
		pre.Next = pHead1
	}
	return dummy.Next
}

func main() {

}
